package main

import (
	"context"
	"github.com/chromedp/chromedp"
	"strconv"
	"time"
)

const PrefixURL = "https://yz.chsi.com.cn/sch/listYzZyjs--schId-"
const MiddlefixURL = ",categoryId-"
const SuffixURL = ".dhtml"

func main() {
	// /html/body/div[1]/div[3]/div[2]/div[2]/div[2]/ul/li[1]
	err, s := majorTask(2, 1)
	println(s)
	if err != nil {
		print(err)
	}
}

func categoryTask(i int) (error, string) {

	// 目标URL
	url := PrefixURL + strconv.Itoa(int(367878)) + MiddlefixURL + strconv.Itoa(int(692157514)) + SuffixURL // 替换为目标网址

	// 创建Chrome实例
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	// 设置超时时间
	ctx, cancel = context.WithTimeout(ctx, 10*time.Second)
	defer cancel()

	// 运行Chrome实例并执行任务
	var result string
	err := chromedp.Run(ctx,
		chromedp.Navigate(url),
		chromedp.WaitVisible(`/html/body/div[1]/div[3]/div[2]/div[1]/div[`+strconv.Itoa(i)+`]`, chromedp.BySearch), // 等待特定元素加载
		chromedp.Text(`/html/body/div[1]/div[3]/div[2]/div[1]/div[`+strconv.Itoa(i)+`]`, &result, chromedp.BySearch),
	)
	//if err != nil {
	//	fmt.Println("院系类目爬取失败： ", err.Error())
	//}

	// 输出爬取结果
	//fmt.Println("院系类目爬取结果:", result)
	return err, result
}

// 单个元素
// /html/body/div[1]/div[3]/div[2]/div[2]/div[1]/ul/li[1]
// /html/body/div[1]/div[3]/div[2]/div[2]/div[2]/ul/li[1]
// 所有元素
// /html/body/div[1]/div[3]/div[2]/div[2]/div[2]/ul
func majorTask(i int, j int) (error, string) {
	// 目标URL
	url := PrefixURL + strconv.Itoa(int(367878)) + MiddlefixURL + strconv.Itoa(int(692157514)) + SuffixURL // 替换为目标网址

	// 创建Chrome实例
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	// 设置超时时间
	ctx, cancel = context.WithTimeout(ctx, 10*time.Second)
	defer cancel()

	// 运行Chrome实例并执行任务
	var result string
	//err := chromedp.Run(ctx,
	//	chromedp.Navigate(url),
	//	chromedp.WaitVisible(`/html/body/div[1]/div[3]/div[2]/div[2]/div[2]/ul`, chromedp.BySearch), // 等待特定元素加载
	//	chromedp.Text(`/html/body/div[1]/div[3]/div[2]/div[2]/div[2]/ul`, &result, chromedp.BySearch),
	//	//chromedp.WaitVisible(`/html/body/div[1]/div[3]/div[2]/div[2]/div[`+strconv.Itoa(i)+`]/ul/li[`+strconv.Itoa(j)+`]`, chromedp.BySearch), // 等待特定元素加载
	//	//chromedp.Text(`/html/body/div[1]/div[3]/div[2]/div[2]/div[`+strconv.Itoa(i)+`]/ul/li[`+strconv.Itoa(j)+`]`, &result, chromedp.BySearch),
	//)
	err := chromedp.Run(ctx,
		chromedp.Navigate(url),
		//
		//chromedp.Evaluate(`/html/body/div[1]/div[3]/div[2]/div[1]/div[8]/a`, nil), // 通过jsPath点击tab
		chromedp.Click(`body > div.main-wrapper > div.container > div:nth-child(4) > div.tab-content > div.item-content.js-current-item.active > ul`, chromedp.BySearch),
		chromedp.WaitVisible(`/html/body/div[1]/div[3]/div[2]/div[1]/div[8]/a`, chromedp.BySearch),   // 等待tab内容可见
		chromedp.Text(`/html/body/div[1]/div[3]/div[2]/div[1]/div[8]/a`, &result, chromedp.BySearch), // 获取tab内容文本
	)
	//if err != nil {
	//	fmt.Println("专业爬取失败： ", err.Error())
	//}

	// 输出爬取结果
	//fmt.Println("院系专业爬取结果:", result)
	return err, result
}

func run() {
	var majorList []string
	//var categoryList []string
	//// 获取院系类目
	//for i := 1; i < 500; i++ {
	//	var err1 error
	//	var categoryValue string
	//	err1, categoryValue = categoryTask(i)
	//	categoryList = append(categoryList, categoryValue)
	//	println("院系类目爬取结果: ", i)
	//	// 判断院系是否爬取完毕
	//	if err1 != nil {
	//		println("院系类目爬取错误: ", err1.Error())
	//		break
	//	}
	//}
	//println("院系类目结果：", categoryList)

	// 获取专业
	for i := 1; i < 500; i++ {
		var err2 error
		var majorValue string
		for j := 1; j < 500; j++ {
			err2, majorValue = majorTask(i, j)
			majorList = append(majorList, majorValue)
			println("专业爬取结果: ", i, j, majorValue)
			// 判断院系是否爬取完毕
			if err2 != nil {
				println("专业爬取错误: ", err2.Error())
				break
			}
		}
		//if err2 != nil {
		//	println("专业爬取结束 ")
		//	break
		//}
	}
	println("专业结果：", majorList)
}
